package com.common.config;

import java.io.File;

import xyz.downgoon.snowflake.Snowflake;
import net.dreamlu.event.EventPlugin;
import net.dreamlu.event.support.DuangBeanFactory;

import com.alibaba.druid.filter.logging.Log4jFilter;
import com.common.GlobalPara;
import com.common.base.DatagridController;
import com.common.interceptor.AppExceptionIntercepor;
import com.common.sysinit.CacheSysCode;
import com.controller.CodeController;
import com.controller.FunctionController;
import com.controller.LoginController;
import com.controller.UserController;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.ActionReporter;
import com.jfinal.core.JFinal;
import com.jfinal.kit.PathKit;
import com.jfinal.kit.PropKit;
import com.jfinal.template.Engine;
import com.jfinal.weixin.sdk.api.ApiConfig;
import com.jfinal.weixin.sdk.api.ApiConfigKit;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.plugin.druid.DruidStatViewHandler;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.render.ViewType;
import com.model._MappingKit;
import com.controller.wx.WXMsgController;

public class MainConfig extends JFinalConfig {
	private Boolean enableWx = false;
	/**
	 * 配置JFinal常量
	 */
	@Override
	public void configConstant(Constants me) {
		//读取数据库配置文件
		PropKit.use("config.properties");
		//设置当前是否为开发模式
		me.setDevMode(PropKit.getBoolean("devMode"));
		
		this.enableWx = PropKit.getBoolean("enableWx");
		if(this.enableWx==null){
			this.enableWx = false;
		}
		//设置默认上传文件保存路径 getFile等使用
		me.setBaseUploadPath("upload/temp/");
		//设置上传最大限制尺寸
		//me.setMaxPostSize(1024*1024*10);
		//设置默认下载文件路径 renderFile使用
		me.setBaseDownloadPath("download");
		//设置默认视图类型
		me.setViewType(ViewType.JSP);
		
		//设置404渲染视图
		//me.setError404View("404.html");
		me.setEncoding("UTF-8");
		
		//日志记录工具，不指定的话默认为log4j，如果log4j初始化异常就用jdklog
		
		this.setLogsPath();
		//指定请求信息打印在action执行之前
		ActionReporter.setReportAfterInvocation(false);
		
		//初始化雪花算法生成器
		this.initSnowFlake();
		
	}
	//雪花算法生成id生成器
	private void initSnowFlake(){
		GlobalPara.snowflake = new Snowflake(PropKit.getLong("datacenterId"), PropKit.getLong("workerId"));
	}
	/**
	 * 自动计算log4j日志存放的位置和名字,自动计算之后log4j的配置文件就不用根据不同的系统进行更改，完全自动化
	 */
	private void setLogsPath(){
		String webRootPath = PathKit.getWebRootPath();//获取app的发布路径 如 D:\apache-tomcat-7.0.52\webapps\framework
		int lastSeparator = webRootPath.lastIndexOf(File.separator);
		String appName = webRootPath.substring(lastSeparator+1,webRootPath.length());//如framework
		
		//如 D:\apache-tomcat-7.0.52 ，日志放在这个路径下比较安全
		String logPath = new File(webRootPath).getParentFile().getParent();
		
		//log的位置如  D:\apache-tomcat-7.0.52\framework\logs\framework_log4j_log.log
		String infoLogsPath = logPath+File.separator+"logs"+ File.separator +appName+"_log4j_log.log";
		String errorLogsPath = logPath+File.separator+"logs"+ File.separator +appName+"_log4j_error.log";
		System.setProperty("appname", appName);
		System.setProperty("infoLogsPath", infoLogsPath);
		System.setProperty("errorLogsPath", errorLogsPath);
	}
	/**
	 * 配置JFinal路由映射
	 */
	@Override
	public void configRoute(Routes me) {
		me.setBaseViewPath("/WEB-INF/jsp");
		me.add("/",LoginController.class,"");
		me.add("/datagrid",DatagridController.class,"");
		me.add("/user",UserController.class,"");
		me.add("/code",CodeController.class,"");
		me.add("/function",FunctionController.class,"");
		//启动微信
		if(this.enableWx){
			me.add("/wxsupport",WXMsgController.class,"");
		}
	}
	/**
	 * 配置JFinal插件
	 * 数据库连接池
	 * ORM
	 * 缓存等插件
	 * 自定义插件
	 */
	@Override
	public void configPlugin(Plugins me) {
		//配置数据库连接池插件
		DruidPlugin dbPlugin=new DruidPlugin(PropKit.getProp("config.properties").get("jdbcUrl"), PropKit.getProp("config.properties").get("user"), PropKit.getProp("config.properties").get("password"));
		dbPlugin.setFilters("stat,wall");
		
		//开发模式下打印sql
		if(JFinal.me().getConstants().getDevMode()){
			Log4jFilter logFilter = new Log4jFilter();
			logFilter.setStatementLogEnabled(false);
			logFilter.setStatementLogErrorEnabled(true);
			logFilter.setStatementExecutableSqlLogEnable(true);
			dbPlugin.addFilter(logFilter);
		}
		
		
		
		//orm映射 配置ActiveRecord插件
		ActiveRecordPlugin arp=new ActiveRecordPlugin(dbPlugin);
		arp.setShowSql(false);//置为false，因为log4j配置了druid的sql语句输出
		arp.setDialect(new MysqlDialect());
		/********在此添加数据库 表-Model 映射*********/
		_MappingKit.mapping(arp);
		
		// 集成第三方异步事件插件url:http://www.jfinal.com/project/7
		EventPlugin eventPlugin = new EventPlugin();
		eventPlugin.async();
		// 设置扫描jar包，默认不扫描
		eventPlugin.scanJar();
		// 设置监听器默认包，多个包名使用;分割，默认全扫描
		eventPlugin.scanPackage("com.common.event");
		// bean工厂，默认为DefaultBeanFactory，可实现IBeanFactory自定义扩展
		eventPlugin.beanFactory(new DuangBeanFactory());
		
		//添加到插件列表中
		me.add(dbPlugin);
		me.add(arp);
		me.add(eventPlugin);
	}
	/**
	 * 配置全局拦截器
	 */
	@Override
	public void configInterceptor(Interceptors me) {
		me.addGlobalActionInterceptor(new com.common.interceptor.AuthInterceptor());
		me.addGlobalActionInterceptor(new AppExceptionIntercepor());
	}
	/**
	 * 配置全局处理器
	 */
	@Override
	public void configHandler(Handlers me) {
		me.add(new DruidStatViewHandler("/druid",new DruidStatViewAuth()));
	}
	/**
	 * JFinal启动后调用
	 */
	@Override
	public void afterJFinalStart() {
		CacheSysCode.cacheSyscode();//缓存code表
		//此处加载微信公众号的一些信息，支持多个公众号，目前先建立一个文件放这些信息，也可以从数据库中查询
		if(this.enableWx){//启动微信
			initWxConfig();
		}
	}
	private void initWxConfig(){
		PropKit.use("wx.properties");
		String token = PropKit.getProp("wx.properties").get("token");
		String appId = PropKit.getProp("wx.properties").get("appId");
		String appSecret = PropKit.getProp("wx.properties").get("appSecret");
		String encodingAesKey = PropKit.getProp("wx.properties").get("encodingAesKey");
		boolean messageEncrypt = PropKit.getProp("wx.properties").getBoolean("messageEncrypt");
		ApiConfig config = new ApiConfig(token,appId,appSecret,messageEncrypt,encodingAesKey);
		ApiConfigKit.putApiConfig(config);
		
		//设置开发模式，这样传过来的xml数据会显示在控制台
		ApiConfigKit.setDevMode(PropKit.getBoolean("devMode"));
	}
	/**
	 * JFinal Stop之前调用 
	 */
	@Override
	public void beforeJFinalStop() {
		
	}
	
	/**
	 * 配置模板引擎 
	 */
	@Override
	public void configEngine(Engine me) {
		//这里只有选择JFinal TPL的时候才用
		//配置共享函数模板
		//me.addSharedFunction("/view/common/layout.html")
	}
	
	

}
